# {{ ansible_managed }}
{% macro render_option(key,value,indent=false) %}
{%   if value is defined %}
{%     if indent == true %}  {% endif %}
{%     if value is sameas true %}
{{ key }} yes
{%     elif value is sameas false %}
{{ key }} no
{%     elif value is string or value is number %}
{{ key }} {{ value }}
{%     else %}
{%       for i in value %}
{{ key }} {{ i }}
{%       endfor %}
{%     endif %}
{%   endif %}
{% endmacro %}
{% macro body_option(key,override) %}
{%   set value = undefined %}
{%   if override is defined %}
{%     set value = override %}
{%   elif sshd[key] is defined %}
{%     set value = sshd[key] %}
{%   elif __sshd_defaults[key] is defined and sshd_skip_defaults != true %}
{%     set value = __sshd_defaults[key] %}
{%   endif %}
{{ render_option(key,value) -}}
{% endmacro %}
{% macro match_block(match_list) %}
{%   if match_list["Condition"] is defined %}
{%     set match_list = [ match_list ]%}
{%   endif %}
{%   if match_list is iterable %}
{%     for match in match_list %}
Match {{ match["Condition"] }}
{{       render_option("AcceptEnv",match["AcceptEnv"],true) -}}
{{       render_option("AllowAgentForwarding",match["AllowAgentForwarding"],true) -}}
{{       render_option("AllowGroups",match["AllowGroups"],true) -}}
{{       render_option("AllowStreamLocalForwarding",match["AllowStreamLocalForwarding"],true) -}}
{{       render_option("AllowTcpForwarding",match["AllowTcpForwarding"],true) -}}
{{       render_option("AllowUsers",match["AllowUsers"],true) -}}
{{       render_option("AuthenticationMethods",match["AuthenticationMethods"],true) -}}
{{       render_option("AuthorizedKeysCommand",match["AuthorizedKeysCommand"],true) -}}
{{       render_option("AuthorizedKeysCommandUser",match["AuthorizedKeysCommandUser"],true) -}}
{{       render_option("AuthorizedKeysFile",match["AuthorizedKeysFile"],true) -}}
{{       render_option("AuthorizedPrincipalsCommand",match["AuthorizedPrincipalsCommand"],true) -}}
{{       render_option("AuthorizedPrincipalsCommandUser",match["AuthorizedPrincipalsCommandUser"],true) -}}
{{       render_option("AuthorizedPrincipalsFile",match["AuthorizedPrincipalsFile"],true) -}}
{{       render_option("Banner",match["Banner"],true) -}}
{{       render_option("ChrootDirectory",match["ChrootDirectory"],true) -}}
{{       render_option("ClientAliveCountMax",match["ClientAliveCountMax"],true) -}}
{{       render_option("ClientAliveInterval",match["ClientAliveInterval"],true) -}}
{{       render_option("DenyGroups",match["DenyGroups"],true) -}}
{{       render_option("DenyUsers",match["DenyUsers"],true) -}}
{{       render_option("ForceCommand",match["ForceCommand"],true) -}}
{{       render_option("GatewayPorts",match["GatewayPorts"],true) -}}
{{       render_option("GSSAPIAuthentication",match["GSSAPIAuthentication"],true) -}}
{{       render_option("HostbasedAcceptedKeyTypes",match["HostbasedAcceptedKeyTypes"],true) -}}
{{       render_option("HostbasedAuthentication",match["HostbasedAuthentication"],true) -}}
{{       render_option("HostbasedUsesNameFromPacketOnly",match["HostbasedUsesNameFromPacketOnly"],true) -}}
{{       render_option("IPQoS",match["IPQoS"],true) -}}
{{       render_option("KbdInteractiveAuthentication",match["KbdInteractiveAuthentication"],true) -}}
{{       render_option("KerberosAuthentication",match["KerberosAuthentication"],true) -}}
{{       render_option("LogLevel",match["LogLevel"],true) -}}
{{       render_option("MaxAuthTries",match["MaxAuthTries"],true) -}}
{{       render_option("MaxSessions",match["MaxSessions"],true) -}}
{{       render_option("PasswordAuthentication",match["PasswordAuthentication"],true) -}}
{{       render_option("PermitEmptyPasswords",match["PermitEmptyPasswords"],true) -}}
{{       render_option("PermitOpen",match["PermitOpen"],true) -}}
{{       render_option("PermitRootLogin",match["PermitRootLogin"],true) -}}
{{       render_option("PermitTTY",match["PermitTTY"],true) -}}
{{       render_option("PermitTunnel",match["PermitTunnel"],true) -}}
{{       render_option("PermitUserRC",match["PermitUserRC"],true) -}}
{{       render_option("PubkeyAcceptedKeyTypes",match["PubkeyAcceptedKeyTypes"],true) -}}
{{       render_option("PubkeyAuthentication",match["PubkeyAuthentication"],true) -}}
{{       render_option("RDomain",match["RDomain"],true) -}}
{{       render_option("RekeyLimit",match["RekeyLimit"],true) -}}
{{       render_option("RevokedKeys",match["RevokedKeys"],true) -}}
{{       render_option("RhostsRSAAuthentication",match["RhostsRSAAuthentication"],true) -}}
{{       render_option("RSAAuthentication",match["RSAAuthentication"],true) -}}
{{       render_option("StreamLocalBindMask",match["StreamLocalBindMask"],true) -}}
{{       render_option("StreamLocalBindUnlink",match["StreamLocalBindUnlink"],true) -}}
{{       render_option("TrustedUserCAKeys",match["TrustedUserCAKeys"],true) -}}
{{       render_option("X11DisplayOffset",match["X11DisplayOffset"],true) -}}
{{       render_option("X11Forwarding",match["X11Forwarding"],true) -}}
{{       render_option("X11UseLocalHost",match["X11UseLocalHost"],true) -}}
{%     endfor %}
{%   endif %}
{% endmacro %}
#PasswordAuthentication
#        是否允许使用基于密码的认证。默认为"yes"。
{{ body_option("PermitRootLogin",sshd_PermitRootLogin) -}}

#密码认证
{{ body_option("PasswordAuthentication",sshd_PasswordAuthentication) -}}

#PermitEmptyPasswords
#        是否允许密码为空的用户远程登录。默认为"no"。
{{ body_option("PermitEmptyPasswords",sshd_PermitEmptyPasswords) -}}

#UseDNS
#        指定 sshd(8) 是否应该对远程主机名进行反向解析，以检查此主机名是否与其IP地址真实对应。默认值为"yes"。
{{ body_option("UseDNS",sshd_UseDNS) -}}
#SSH服务端口
{{ body_option("Port",sshd_Port) -}}

#X11Forwarding
#        是否允许进行 X11 转发。默认值是"no"，设为"yes"表示允许。
#        如果允许X11转发并且sshd(8)代理的显示区被配置为在含有通配符的地址(X11UseLocalhost)上监听。
#        那么将可能有额外的信息被泄漏。由于使用X11转发的可能带来的风险，此指令默认值为"no"。
#        需要注意的是，禁止X11转发并不能禁止用户转发X11通信，因为用户可以安装他们自己的转发器。
#        如果启用了 UseLogin ，那么X11转发将被自动禁止。
{{ body_option("X11Forwarding",sshd_X11Forwarding) -}}

#AuthorizedKeysFile
#        存放该用户可以用来登录的 RSA/DSA 公钥。
#        该指令中可以使用下列根据连接时的实际情况进行展开的符号：
#        %% 表示'%'、%h 表示用户的主目录、%u 表示该用户的用户名。
#        经过扩展之后的值必须要么是绝对路径，要么是相对于用户主目录的相对路径。
#        默认值是".ssh/authorized_keys"。
{{ body_option("AuthorizedKeysFile",sshd_AuthorizedKeysFile) -}}

#Subsystem
#        配置一个外部子系统(例如，一个文件传输守护进程)。仅用于SSH-2协议。
#        值是一个子系统的名字和对应的命令行(含选项和参数)。比如"sft /bin/sftp-server"。
{{ body_option("Subsystem",sshd_Subsystem) -}}

#HostKey
#        主机私钥文件的位置。如果权限不对，sshd(8) 可能会拒绝启动。
#        SSH-1默认是 /etc/ssh/ssh_host_key 。
#        SSH-2默认是 /etc/ssh/ssh_host_rsa_key 和 /etc/ssh/ssh_host_dsa_key 。
#        一台主机可以拥有多个不同的私钥。"rsa1"仅用于SSH-1，"dsa"和"rsa"仅用于SSH-2。
{{ body_option("HostKey",sshd_HostKey) -}}

#SyslogFacility
#        指定 sshd(8) 将日志消息通过哪个日志子系统(facility)发送。有效值是：
#        DAEMON, USER, AUTH(默认), LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7
{{ body_option("SyslogFacility",sshd_SyslogFacility) -}}

#AcceptEnv
#指定客户端发送的哪些环境变量将会被传递到会话环境中。[注意]只有SSH-2协议支持环境变量的传递。
#指令的值是空格分隔的变量名列表(其中可以使用'*'和'?'作为通配符)。也可以使用多个 AcceptEnv 达到同样的目的。
#需要注意的是，有些环境变量可能会被用于绕过禁止用户使用的环境变量。由于这个原因，该指令应当小心使用。
#默认是不传递任何环境变量
{{ body_option("AcceptEnv",sshd_AcceptEnv) -}}

#ChallengeResponseAuthentication
#        是否允许质疑-应答(challenge-response)认证。默认值是"yes"。
#        所有 login.conf(5) 中允许的认证方式都被支持。
{{ body_option("ChallengeResponseAuthentication",sshd_ChallengeResponseAuthentication) -}}

#GSSAPIAuthentication
#        是否允许使用基于 GSSAPI 的用户认证。默认值为"no"。仅用于SSH-2。
{{ body_option("GSSAPIAuthentication",sshd_GSSAPIAuthentication) -}}

#GSSAPICleanupCredentials
#        是否在用户退出登录后自动销毁用户凭证缓存。默认值是"yes"。仅用于SSH-2。
{{ body_option("GSSAPICleanupCredentials",sshd_GSSAPICleanupCredentials) -}}

#ListenAddress
#指定 sshd(8) 监听的网络地址，默认监听所有地址,可以使用下面的格式：
#ListenAddress host|IPv4_addr|IPv6_addr
#ListenAddress host|IPv4_addr:port
#ListenAddress [host|IPv6_addr]:port
#如果未指定 port ，那么将使用 Port 指令的值。
#可以使用多个 ListenAddress 指令监听多个地址
{{ body_option("ListenAddress",sshd_ListenAddress) -}}

#LogLevel
#        指定 sshd(8) 的日志等级(详细程度)。可用值如下：
#        QUIET, FATAL, ERROR, INFO(默认), VERBOSE, DEBUG, DEBUG1, DEBUG2, DEBUG3
#        DEBUG 与 DEBUG1 等价；DEBUG2 和 DEBUG3 则分别指定了更详细、更罗嗦的日志输出。
#        比 DEBUG 更详细的日志可能会泄漏用户的敏感信息，因此反对使用。
{{ body_option("LogLevel",sshd_LogLevel) -}}

#指定 sshd(8) 应当使用哪种地址族。取值范围是："any"(默认)、"inet"(仅IPv4)、"inet6"(仅IPv6)。
{{ body_option("AddressFamily",sshd_AddressFamily) -}}




###########################################################################################################
#指定 sshd(8) 支持的SSH协议的版本号。
#'1'和'2'表示仅仅支持SSH-1和SSH-2协议。"2,1"表示同时支持SSH-1和SSH-2协议。
{{ body_option("Protocol",sshd_Protocol) -}}

{{ body_option("AllowAgentForwarding",sshd_AllowAgentForwarding) -}}

#AllowGroups
#        这个指令后面跟着一串用空格分隔的组名列表(其中可以使用"*"和"?"通配符)。默认允许所有组登录。
#        如果使用了这个指令，那么将仅允许这些组中的成员登录，而拒绝其它所有组。
#        这里的"组"是指"主组"(primary group)，也就是/etc/passwd文件中指定的组。
#        这里只允许使用组的名字而不允许使用GID。相关的 allow/deny 指令按照下列顺序处理：
#        DenyUsers, AllowUsers, DenyGroups, AllowGroups
{{ body_option("AllowGroups",sshd_AllowGroups) -}}
{{ body_option("AllowStreamLocalForwarding",sshd_AllowStreamLocalForwarding) -}}

#AllowTcpForwarding
#        是否允许TCP转发，默认值为"yes"。
#        禁止TCP转发并不能增强安全性，除非禁止了用户对shell的访问，因为用户可以安装他们自己的转发器。
{{ body_option("AllowTcpForwarding",sshd_AllowTcpForwarding) -}}

#AllowUsers
#        这个指令后面跟着一串用空格分隔的用户名列表(其中可以使用"*"和"?"通配符)。默认允许所有用户登录。
#        如果使用了这个指令，那么将仅允许这些用户登录，而拒绝其它所有用户。
#        如果指定了 USER@HOST 模式的用户，那么 USER 和 HOST 将同时被检查。
#        这里只允许使用用户的名字而不允许使用UID。相关的 allow/deny 指令按照下列顺序处理：
#        DenyUsers, AllowUsers, DenyGroups, AllowGroups
{{ body_option("AllowUsers",sshd_AllowUsers) -}}
{{ body_option("AuthenticationMethods",sshd_AuthenticationMethods) -}}
{{ body_option("AuthorizedKeysCommand",sshd_AuthorizedKeysCommand) -}}
{{ body_option("AuthorizedKeysCommandUser",sshd_AuthorizedKeysCommandUser) -}}

{{ body_option("AuthorizedPrincipalsCommand",sshd_AuthorizedPrincipalsCommand) -}}
{{ body_option("AuthorizedPrincipalsCommandUser",sshd_AuthorizedPrincipalsCommandUser) -}}
{{ body_option("AuthorizedPrincipalsFile",sshd_AuthorizedPrincipalsFile) -}}

#Banner
#        将这个指令指定的文件中的内容在用户进行认证前显示给远程用户。
#        这个特性仅能用于SSH-2，默认什么内容也不显示。"none"表示禁用这个特性。
{{ body_option("Banner",sshd_Banner) -}}

{{ body_option("ChrootDirectory",sshd_ChrootDirectory) -}}

#Ciphers
#        指定SSH-2允许使用的加密算法。多个算法之间使用逗号分隔。可以使用的算法如下：
#        "aes128-cbc", "aes192-cbc", "aes256-cbc", "aes128-ctr", "aes192-ctr", "aes256-ctr",
#        "3des-cbc", "arcfour128", "arcfour256", "arcfour", "blowfish-cbc", "cast128-cbc"
#        默认值是可以使用上述所有算法。
{{ body_option("Ciphers",sshd_Ciphers) -}}

#ClientAliveCountMax
#        sshd(8) 在未收到任何客户端回应前最多允许发送多少个"alive"消息。默认值是 3 。
#        到达这个上限后，sshd(8) 将强制断开连接、关闭会话。
#        需要注意的是，"alive"消息与 TCPKeepAlive 有很大差异。
#        "alive"消息是通过加密连接发送的，因此不会被欺骗；而 TCPKeepAlive 却是可以被欺骗的。
#        如果 ClientAliveInterval 被设为 15 并且将 ClientAliveCountMax 保持为默认值，
#        那么无应答的客户端大约会在45秒后被强制断开。这个指令仅可以用于SSH-2协议。
{{ body_option("ClientAliveCountMax",sshd_ClientAliveCountMax) -}}

#ClientAliveInterval
#        设置一个以秒记的时长，如果超过这么长时间没有收到客户端的任何数据，
#        sshd(8) 将通过安全通道向客户端发送一个"alive"消息，并等候应答。
#        默认值 0 表示不发送"alive"消息。这个选项仅对SSH-2有效。
{{ body_option("ClientAliveInterval",sshd_ClientAliveInterval) -}}

#Compression
#        是否对通信数据进行加密，还是延迟到认证成功之后再对通信数据加密。
#        可用值："yes", "delayed"(默认), "no"。
{{ body_option("Compression",sshd_Compression) -}}
{{ body_option("DebianBanner",sshd_DebianBanner) -}}

#DenyGroups
#        这个指令后面跟着一串用空格分隔的组名列表(其中可以使用"*"和"?"通配符)。默认允许所有组登录。
#        如果使用了这个指令，那么这些组中的成员将被拒绝登录。
#        这里的"组"是指"主组"(primary group)，也就是/etc/passwd文件中指定的组。
#        这里只允许使用组的名字而不允许使用GID。相关的 allow/deny 指令按照下列顺序处理：
#        DenyUsers, AllowUsers, DenyGroups, AllowGroups
{{ body_option("DenyGroups",sshd_DenyGroups) -}}

#DenyUsers
#        这个指令后面跟着一串用空格分隔的用户名列表(其中可以使用"*"和"?"通配符)。默认允许所有用户登录。
#        如果使用了这个指令，那么这些用户将被拒绝登录。
#        如果指定了 USER@HOST 模式的用户，那么 USER 和 HOST 将同时被检查。
#        这里只允许使用用户的名字而不允许使用UID。相关的 allow/deny 指令按照下列顺序处理：
#        DenyUsers, AllowUsers, DenyGroups, AllowGroups
{{ body_option("DenyUsers",sshd_DenyUsers) -}}

{{ body_option("DisableForwarding",sshd_DisableForwarding) -}}
{{ body_option("ExposeAuthInfo",sshd_ExposeAuthInfo) -}}
{{ body_option("FingerprintHash",sshd_FingerprintHash) -}}

#ForceCommand
#        强制执行这里指定的命令而忽略客户端提供的任何命令。这个命令将使用用户的登录shell执行(shell -c)。
#        这可以应用于 shell 、命令、子系统的完成，通常用于 Match 块中。
#        这个命令最初是在客户端通过 SSH_ORIGINAL_COMMAND 环境变量来支持的。

{{ body_option("ForceCommand",sshd_ForceCommand) -}}

#GatewayPorts
#        是否允许远程主机连接本地的转发端口。默认值是"no"。
#        sshd(8) 默认将远程端口转发绑定到loopback地址。这样将阻止其它远程主机连接到转发端口。
#        GatewayPorts 指令可以让 sshd 将远程端口转发绑定到非loopback地址，这样就可以允许远程主机连接了。
#        "no"表示仅允许本地连接，"yes"表示强制将远程端口转发绑定到统配地址(wildcard address)，
#        "clientspecified"表示允许客户端选择将远程端口转发绑定到哪个地址。
{{ body_option("GatewayPorts",sshd_GatewayPorts) -}}

{{ body_option("GSSAPIKeyExchange",sshd_GSSAPIKeyExchange) -}}
{{ body_option("GSSAPIStoreCredentialsOnRekey",sshd_GSSAPIStoreCredentialsOnRekey) -}}
{{ body_option("GSSAPIStrictAcceptorCheck",sshd_GSSAPIStrictAcceptorCheck) -}}
{{ body_option("HPNBufferSize",sshd_HPNBufferSize) -}}
{{ body_option("HPNDisabled",sshd_HPNDisabled) -}}
{{ body_option("HostCertificate",sshd_HostCertificate) -}}
{{ body_option("HostKeyAgent",sshd_HostKeyAgent) -}}
{{ body_option("HostKeyAlgorithms",sshd_HostKeyAlgorithms) -}}
{{ body_option("HostbasedAcceptedKeyTypes",sshd_HostbasedAcceptedKeyTypes) -}}

#HostbasedAuthentication
#        这个指令与 RhostsRSAAuthentication 类似，但是仅可以用于SSH-2。推荐使用默认值"no"。
#        推荐使用默认值"no"禁止这种不安全的认证方式。
{{ body_option("HostbasedAuthentication",sshd_HostbasedAuthentication) -}}

#HostbasedUsesNameFromPacketOnly
#        在开启 HostbasedAuthentication 的情况下，
#        指定服务器在使用 ~/.shosts ~/.rhosts /etc/hosts.equiv 进行远程主机名匹配时，是否进行反向域名查询。
#        "yes"表示 sshd(8) 信任客户端提供的主机名而不进行反向查询。默认值是"no"。
{{ body_option("HostbasedUsesNameFromPacketOnly",sshd_HostbasedUsesNameFromPacketOnly) -}}
{{ body_option("IPQoS",sshd_IPQoS) -}}

#IgnoreRhosts
#        是否在 RhostsRSAAuthentication 或 HostbasedAuthentication 过程中忽略 .rhosts 和 .shosts 文件。
#        不过 /etc/hosts.equiv 和 /etc/shosts.equiv 仍将被使用。推荐设为默认值"yes"。
{{ body_option("IgnoreRhosts",sshd_IgnoreRhosts) -}}

#IgnoreUserKnownHosts
#        是否在 RhostsRSAAuthentication 或 HostbasedAuthentication 过程中忽略用户的 ~/.ssh/known_hosts 文件。
#        默认值是"no"。为了提高安全性，可以设为"yes"。
{{ body_option("IgnoreUserKnownHosts",sshd_IgnoreUserKnownHosts) -}}
{{ body_option("KbdInteractiveAuthentication",sshd_KbdInteractiveAuthentication) -}}
{{ body_option("KerberosAuthentication",sshd_KerberosAuthentication) -}}

#KerberosGetAFSToken
#        如果使用了 AFS 并且该用户有一个 Kerberos 5 TGT，那么开启该指令后，
#        将会在访问用户的家目录前尝试获取一个 AFS token 。默认为"no"。

{{ body_option("KerberosGetAFSToken",sshd_KerberosGetAFSToken) -}}
{{ body_option("KerberosOrLocalPasswd",sshd_KerberosOrLocalPasswd) -}}
{{ body_option("KerberosTicketCleanup",sshd_KerberosTicketCleanup) -}}
{{ body_option("KexAlgorithms",sshd_KexAlgorithms) -}}

#KeyRegenerationInterval
#        在SSH-1协议下，短命的服务器密钥将以此指令设置的时间为周期(秒)，不断重新生成。
#        这个机制可以尽量减小密钥丢失或者黑客攻击造成的损失。
#        设为 0 表示永不重新生成，默认为 3600(秒)。
{{ body_option("KeyRegenerationInterval",sshd_KeyRegenerationInterval) -}}

#LoginGraceTime
#        限制用户必须在指定的时限内认证成功，0 表示无限制。默认值是 120 秒。
{{ body_option("LoginGraceTime",sshd_LoginGraceTime) -}}

#MACs
#        指定允许在SSH-2中使用哪些消息摘要算法来进行数据校验。
#        可以使用逗号分隔的列表来指定允许使用多个算法。默认值(包含所有可以使用的算法)是：
#        hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-sha1-96,hmac-md5-96
{{ body_option("MACs",sshd_MACs) -}}

#MaxAuthTries
#        指定每个连接最大允许的认证次数。默认值是 6 。
#        如果失败认证的次数超过这个数值的一半，连接将被强制断开，且会生成额外的失败日志消息。
{{ body_option("MaxAuthTries",sshd_MaxAuthTries) -}}
{{ body_option("MaxSessions",sshd_MaxSessions) -}}

#MaxStartups
#        最大允许保持多少个未认证的连接。默认值是 10 。
#        到达限制后，将不再接受新连接，除非先前的连接认证成功或超出 LoginGraceTime 的限制。
{{ body_option("MaxStartups",sshd_MaxStartups) -}}
{{ body_option("NoneEnabled",sshd_NoneEnabled) -}}
{{ body_option("PermitOpen",sshd_PermitOpen) -}}

{{ body_option("PermitTTY",sshd_PermitTTY) -}}

#PermitTunnel
#        是否允许 tun(4) 设备转发。可用值如下：
#        "yes", "point-to-point"(layer 3), "ethernet"(layer 2), "no"(默认)。
#        "yes"同时蕴含着"point-to-point"和"ethernet"。
{{ body_option("PermitTunnel",sshd_PermitTunnel) -}}

#PermitUserEnvironment
#        指定是否允许 sshd(8) 处理 ~/.ssh/environment 以及 ~/.ssh/authorized_keys 中的 environment= 选项。
#        默认值是"no"。如果设为"yes"可能会导致用户有机会使用某些机制(比如 LD_PRELOAD)绕过访问控制，造成安全漏洞。
{{ body_option("PermitUserEnvironment",sshd_PermitUserEnvironment) -}}
{{ body_option("PermitUserRC",sshd_PermitUserRC) -}}

#PidFile
#        指定在哪个文件中存放SSH守护进程的进程号，默认为 /var/run/sshd.pid 文件。
{{ body_option("PidFile",sshd_PidFile) -}}

#PrintLastLog
#        指定 sshd(8) 是否在每一次交互式登录时打印最后一位用户的登录时间。默认值是"yes"。
{{ body_option("PrintLastLog",sshd_PrintLastLog) -}}

#PrintMotd
#        指定 sshd(8) 是否在每一次交互式登录时打印 /etc/motd 文件的内容。默认值是"yes"。
{{ body_option("PrintMotd",sshd_PrintMotd) -}}
{{ body_option("PubkeyAcceptedKeyTypes",sshd_PubkeyAcceptedKeyTypes) -}}

#PubkeyAuthentication
#        是否允许公钥认证。仅可以用于SSH-2。默认值为"yes"。
{{ body_option("PubkeyAuthentication",sshd_PubkeyAuthentication) -}}

#RSAAuthentication
#        是否允许使用纯 RSA 公钥认证。仅用于SSH-1。默认值是"yes"。
{{ body_option("RSAAuthentication",sshd_RSAAuthentication) -}}
{{ body_option("RekeyLimit",sshd_RekeyLimit) -}}
{{ body_option("RevokedKeys",sshd_RevokedKeys) -}}
{{ body_option("RDomain",sshd_RDomain) -}}

#HostbasedAuthentication
#        这个指令与 RhostsRSAAuthentication 类似，但是仅可以用于SSH-2。推荐使用默认值"no"。
#        推荐使用默认值"no"禁止这种不安全的认证方式。
{{ body_option("RhostsRSAAuthentication",sshd_RhostsRSAAuthentication) -}}

#ServerKeyBits
#        指定临时服务器密钥的长度。仅用于SSH-1。默认值是 768(位)。最小值是 512 。
{{ body_option("ServerKeyBits",sshd_ServerKeyBits) -}}
{{ body_option("StreamLocalBindMask",sshd_StreamLocalBindMask) -}}
{{ body_option("StreamLocalBindUnlink",sshd_StreamLocalBindUnlink) -}}

#StrictModes
#        指定是否要求 sshd(8) 在接受连接请求前对用户主目录和相关的配置文件进行宿主和权限检查。
#        强烈建议使用默认值"yes"来预防可能出现的低级错误。
{{ body_option("StrictModes",sshd_StrictModes) -}}


#TCPKeepAlive
#        指定系统是否向客户端发送 TCP keepalive 消息。默认值是"yes"。
#        这种消息可以检测到死连接、连接不当关闭、客户端崩溃等异常。
#        可以设为"no"关闭这个特性。
{{ body_option("TCPKeepAlive",sshd_TCPKeepAlive) -}}
{{ body_option("TcpRcvBufPoll",sshd_TcpRcvBufPoll) -}}
{{ body_option("TrustedUserCAKeys",sshd_TrustedUserCAKeys) -}}


#UseLogin
#        是否在交互式会话的登录过程中使用 login(1) 。默认值是"no"。
#        如果开启此指令，那么 X11Forwarding 将会被禁止，因为 login(1) 不知道如何处理 xauth(1) cookies 。
#        需要注意的是，login(1) 是禁止用于远程执行命令的。
#        如果指定了 UsePrivilegeSeparation ，那么它将在认证完成后被禁用。
{{ body_option("UseLogin",sshd_UseLogin) -}}
{{ body_option("UsePAM",sshd_UsePAM) -}}

#UsePrivilegeSeparation
#        是否让 sshd(8) 通过创建非特权子进程处理接入请求的方法来进行权限分离。默认值是"yes"。
#        认证成功后，将以该认证用户的身份创建另一个子进程。
#        这样做的目的是为了防止通过有缺陷的子进程提升权限，从而使系统更加安全。

{{ body_option("UsePrivilegeSeparation",sshd_UsePrivilegeSeparation) -}}
{{ body_option("VersionAddendum",sshd_VersionAddendum) -}}

#X11DisplayOffset
#        指定 sshd(8) X11 转发的第一个可用的显示区(display)数字。默认值是 10 。
#        这个可以用于防止 sshd 占用了真实的 X11 服务器显示区，从而发生混淆。
{{ body_option("X11DisplayOffset",sshd_X11DisplayOffset) -}}

#X11UseLocalhost
#        sshd(8) 是否应当将X11转发服务器绑定到本地loopback地址。默认值是"yes"。
#        sshd 默认将转发服务器绑定到本地loopback地址并将 DISPLAY 环境变量的主机名部分设为"localhost"。
#        这可以防止远程主机连接到 proxy display 。不过某些老旧的X11客户端不能在此配置下正常工作。
#        为了兼容这些老旧的X11客户端，你可以设为"no"。
{{ body_option("X11UseLocalhost",sshd_X11UseLocalhost) -}}

#XAuthLocation
#        指定 xauth(1) 程序的绝对路径。默认值是 /usr/X11R6/bin/xauth
{{ body_option("XAuthLocation",sshd_XAuthLocation) -}}
{% if sshd['Match'] is defined %}
{{ match_block(sshd['Match']) -}}
{% endif %}
{% if sshd_match is defined %}
{{ match_block(sshd_match) -}}
{% endif %}
{% if sshd_match_1 is defined %}
{{ match_block(sshd_match_1) -}}
{% endif %}
{% if sshd_match_2 is defined %}
{{ match_block(sshd_match_2) -}}
{% endif %}
{% if sshd_match_3 is defined %}
{{ match_block(sshd_match_3) -}}
{% endif %}
{% if sshd_match_4 is defined %}
{{ match_block(sshd_match_4) -}}
{% endif %}
{% if sshd_match_5 is defined %}
{{ match_block(sshd_match_5) -}}
{% endif %}
{% if sshd_match_6 is defined %}
{{ match_block(sshd_match_6) -}}
{% endif %}
{% if sshd_match_7 is defined %}
{{ match_block(sshd_match_7) -}}
{% endif %}
{% if sshd_match_8 is defined %}
{{ match_block(sshd_match_8) -}}
{% endif %}
{% if sshd_match_9 is defined %}
{{ match_block(sshd_match_9) -}}
{% endif %}
